
export function injectXhrError() {
    let XMLHttpRequest = window.XMLHttpRequest
    let oldOpen = XMLHttpRequest.prototype.open
    // 改写open方法
    XMLHttpRequest.prototype.open = function(method, url, async) {
        // 过滤掉 sockjs 请求 避免死循环
        if (!url.match(/sockjs/)) this.$_logData = { method, url, async }
        // 调用原来的方法
        return oldOpen.apply(this, arguments)
    }

    let oldSend = XMLHttpRequest.prototype.send
    // 改写send方法
    XMLHttpRequest.prototype.send = function (body) {
        if (this.$_logData) {
            let startTime = Date.now() // 请求发出时间

            let handle = type => event => {
                let duration = Date.now() - startTime
                let status = this.status // 状态吗 200...
                let statusText = this.statusText // OK ？ Server Error

                let log = {
                    kind: 'stability',
                    type: 'xhr', // xhr 请求
                    eventType: type, // 事件类型
                    pathname: this.$_logData.url, // 请求路径
                    status: status + ' ' + statusText, // 状态码
                    duration, // 请求持续时间
                    response: this.response ? JSON.stringify(this.response) : '', // 响应体
                    params: body // 请求参数
                }

                console.log('xhr-log', log)
            }

            this.addEventListener('load', handle('load'), true)
            this.addEventListener('error', handle('error'), true)
            this.addEventListener('abort', handle('abort'), true)
        }

        return oldSend.apply(this, arguments)
    }
}